home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / bittorrentTracker.php < prev    next >
PHP Script  |  2010-05-19  |  5KB  |  138 lines

  1. <?php
  2. /**
  3.  * Bittorrent tracker
  4.  *
  5.  * PHP version 5
  6.  *
  7.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  8.  * that is available through the world-wide-web at the following URI:
  9.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  10.  * the PHP License and are unable to obtain it through the web, please
  11.  * send a note to license@php.net so we can mail you a copy immediately.
  12.  *
  13.  * @category   NA
  14.  * @package    NA
  15.  * @author     Nicolas Bruley / Peer 2 World <contact@weezo.net>
  16.  * @copyright  2005-2007 Nicolas Bruley / Peer 2 World
  17.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  18.  * @version    CVS: $Id:$
  19.  * @link       http://www.weezo.net
  20.  * @since      File available since Release 1.0.8
  21.  */
  22.  
  23. /**
  24.  * @desc debug
  25.  *
  26.  * @param string $msg: debug message
  27.  */
  28. function out($msg){cfDebugSingle($msg);}
  29.  
  30.  
  31. /**
  32.  * @desc Return error
  33.  *
  34.  * @param string $errorCaption: caption to be displayed in bittorrent client
  35.  */
  36. function trackerError($errorCaption){
  37.     out('Error : '.$errorCaption.' => '.$_SERVER['REQUEST_URI']);
  38.     die('d14:failure reason'.strlen($errorCaption).':'.$errorCaption.'e');
  39. }
  40.  
  41. out('Tracker request :'.$_SERVER['REQUEST_URI']);
  42.  
  43. // Check GET parameters (1/2)
  44. if(!isset($_GET['bittorrentPort'])) trackerError('Incorrect Torrent file');
  45.  
  46. cfDebugSetBuffer('bittorrent',$_GET);
  47.  
  48. // Correct ill-formated GET address (official bittorrent client...)
  49. if(strpos($_GET['bittorrentPort'],'?')){
  50.     $get=substr($_GET['bittorrentPort'],strpos($_GET['bittorrentPort'],'?')+1);
  51.     if(strpos($get,'=')) $_GET[substr($get,0,strpos($get,'='))]=substr($get,strpos($get,'=')+1);
  52.     $_GET['bittorrentPort']=substr($_GET['bittorrentPort'],0,strpos($_GET['bittorrentPort'],'?'));
  53. }
  54.  
  55. // Check GET parameters (2/2)
  56. if(!isset($_GET['info_hash'])) trackerError('Incorrect Torrent file');
  57. if(!cfGGetVar('bittorrentEnabled')) trackerError(cfCaption('loginForbiddenAccess'));
  58. if(!isset($_GET['event'])) $_GET['event']='started';
  59.  
  60. // Retreive info_hash
  61. $infoHash=substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'info_hash=')+10);
  62. if(strpos($infoHash,'&')) $infoHash=substr($infoHash,0,strpos($infoHash,'&'));
  63. $infoHash=str_replace('-','%2D',str_replace('.','%2E',str_replace('_','%5F',strtoupper($infoHash))));
  64. $infoHash=strtolower(rawurldecode($infoHash));
  65.  
  66. // Stopped and Completed events
  67. if((isset($_GET['left']) && $_GET['left']==0) || $_GET['event']=='stopped' || $_GET['event']=='completed'){
  68.     // Completed download : inform seeder
  69.     if($_GET['event']=='completed'){
  70.         if($handle=@fsockopen('127.0.0.1',cfGGetVar('bittorrentPort'),$errno,$errstr,4)) {
  71.             fwrite($handle,'torrentCompleted'.rawurldecode($infoHash));
  72.             fclose($handle);
  73.         }
  74.  
  75.     }
  76.     $response='d8:completei1e10:incompletei0e8:intervali10800e5:peersld2:ip9:127.0.0.27:peer id20:-WZ0000-fooXXXXXXXXX4:porti7000eeee';
  77.     out('event : '.$_GET['event'].' response : '.$response);
  78.     // Send "fake" response
  79.     header('Content-Type: text/plain');
  80.     die($response);
  81. }
  82.  
  83. // Seek torrent in transfers
  84. require_once(INCLUDE_DIR.'transferFunctions.php');
  85. $transfers=tReadTransfersFiles();
  86. $found=false;
  87. foreach ($transfers as $id=>$tr) {
  88.     if($tr->type=='bittorrentDownload' && strtolower(rawurldecode($tr->infoHash))==$infoHash) {$found=true; break;}
  89. }
  90.  
  91. // If transfer is part of a directLink or a publishDownload, check it's still valid
  92. if($tokenId=$tr->linkedTransferToken){
  93.     $tokenList=efTokensRead();
  94.     if(!isset($tokenList[$tokenId])) $found=false;
  95.     elseif(!efTokenIsValid($tokenList[$tokenId])) $found=false;
  96.     unset($tokenList);
  97. }
  98.  
  99. // Centralized authentication check: inform central server wether torrent exists or not
  100. if(isset($_GET['auth'])) die(($found)?'ok':'invalid');
  101.  
  102. // Check transfer
  103. if(!$found) trackerError('Nonexistent Torrent');
  104. $extraInfo='';
  105. if($tr->trackerIdSet){
  106.     //if(!isset($_GET['trackerid']) || $_GET['trackerid']!=$tr->id) trackerError(cfCaption('loginForbiddenAccess'));
  107.     $extraInfo.='10:tracker id'.strlen($tr->id).':'.$tr->id;
  108.     if($tr->status==8) trackerError('Torrent error - source files modified');
  109.     if($tr->status==4) trackerError('Torrent error - Tranfer completed, cannot re-download');
  110.     if($tr->status==6 || $tr->status==9) trackerError('Torrent error - Tranfer canceled');
  111.  
  112. }
  113. else {
  114.     $extraInfo.='10:tracker id'.strlen($tr->id).':'.$tr->id;
  115.     $transfers[$tr->id]->trackerIdSet=true;
  116.     $needSave=true;
  117. }
  118.  
  119. // Update transfer status to "connecting"
  120. if($tr->status<3 || $tr->status==5){
  121.     $transfers[$tr->id]->status=7;
  122.     $needSave=true;
  123. }
  124. // Send response
  125. $ip=str_replace('localhost','127.0.0.1',$_SERVER['SERVER_ADDR']); // Server IP adress // prod
  126. if(strpos($ip,':')) $ip=substr($ip,0,strpos($ip,':'));
  127.  
  128. //$response='d8:intervali120e12:min intervali120e8:completei1e10:incompletei0e5:peersld2:ip'.strlen($ip).':'.$ip.'7:peer id20:-WZ0000-unRegistered4:porti'.cfGGetVar('bittorrentPort').'eeee';
  129. $response='d8:completei1e10:incompletei0e8:intervali120e12:min intervali120e5:peersld2:ip'.strlen($ip).':'.$ip.'7:peer id20:-WZ0000-unRegistered4:porti'.cfGGetVar('bittorrentPort').'eeee';
  130.  
  131. header('Content-Type: text/plain');
  132. echo $response;
  133.  
  134. out('Request OK, reponse : '.$response);
  135.  
  136. // Save tranfers
  137. if(isset($needSave)) tWritePHPTransfersFile($transfers);
  138. ?>